<!DOCTYPE html>
<html lang="zh-cn" dir="ltr">
    <head><meta charset='utf-8'>
<meta name='viewport' content='width=device-width, initial-scale=1'><meta name='description' content='如何创建和链接使用'>
<title>GCC上的动态库与静态库</title>

<link rel='canonical' href='https://ypr.gitee.io/p/prog/cpp-gcc-sharedandstaticlib/'>

<link rel="stylesheet" href="/scss/style.min.abbd69b2908fdfcd5179898beaafd374514a86538d81639ddd2c58c06ae54e40.css"><meta property='og:title' content='GCC上的动态库与静态库'>
<meta property='og:description' content='如何创建和链接使用'>
<meta property='og:url' content='https://ypr.gitee.io/p/prog/cpp-gcc-sharedandstaticlib/'>
<meta property='og:site_name' content='天远博客'>
<meta property='og:type' content='article'><meta property='article:section' content='Post' /><meta property='article:tag' content='编程' /><meta property='article:tag' content='C&#43;&#43;' /><meta property='article:tag' content='gcc' /><meta property='article:tag' content='动态库' /><meta property='article:tag' content='静态库' /><meta property='article:published_time' content='2024-01-18T15:00:00&#43;08:00'/><meta property='article:modified_time' content='2024-01-18T15:05:00&#43;08:00'/>
<meta name="twitter:title" content="GCC上的动态库与静态库">
<meta name="twitter:description" content="如何创建和链接使用">
    </head>
    <body class="
    article-page
    ">
    <script>
        (function() {
            const colorSchemeKey = 'StackColorScheme';
            if(!localStorage.getItem(colorSchemeKey)){
                localStorage.setItem(colorSchemeKey, "auto");
            }
        })();
    </script><script>
    (function() {
        const colorSchemeKey = 'StackColorScheme';
        const colorSchemeItem = localStorage.getItem(colorSchemeKey);
        const supportDarkMode = window.matchMedia('(prefers-color-scheme: dark)').matches === true;

        if (colorSchemeItem == 'dark' || colorSchemeItem === 'auto' && supportDarkMode) {
            

            document.documentElement.dataset.scheme = 'dark';
        } else {
            document.documentElement.dataset.scheme = 'light';
        }
    })();
</script>
<div class="container main-container flex on-phone--column extended"><aside class="sidebar left-sidebar sticky ">
    <button class="hamburger hamburger--spin" type="button" id="toggle-menu" aria-label="切换菜单">
        <span class="hamburger-box">
            <span class="hamburger-inner"></span>
        </span>
    </button>

    <header>
        
            
            <figure class="site-avatar">
                <a href="/">
                
                    
                    
                    
                        
                        <img src="/img/TianYuan_hu00d35ae089bda3bce539f572b00404d0_57842_300x0_resize_box_3.png" width="300"
                            height="300" class="site-logo" loading="lazy" alt="Avatar">
                    
                
                </a>
                
            </figure>
            
        
        
        <div class="site-meta">
            <h1 class="site-name"><a href="/">天远博客</a></h1>
            <h2 class="site-description">专注于技术沉淀！！！</h2>
        </div>
    </header><ol class="social-menu">
            
                <li>
                    <a 
                        href='https://github.com/yuanpeirong'
                        target="_blank"
                        title="GitHub"
                        rel="me"
                    >
                        
                        
                            <svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-brand-github" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
  <path stroke="none" d="M0 0h24v24H0z" fill="none"/>
  <path d="M9 19c-4.3 1.4 -4.3 -2.5 -6 -3m12 5v-3.5c0 -1 .1 -1.4 -.5 -2c2.8 -.3 5.5 -1.4 5.5 -6a4.6 4.6 0 0 0 -1.3 -3.2a4.2 4.2 0 0 0 -.1 -3.2s-1.1 -.3 -3.5 1.3a12.3 12.3 0 0 0 -6.2 0c-2.4 -1.6 -3.5 -1.3 -3.5 -1.3a4.2 4.2 0 0 0 -.1 3.2a4.6 4.6 0 0 0 -1.3 3.2c0 4.6 2.7 5.7 5.5 6c-.6 .6 -.6 1.2 -.5 2v3.5" />
</svg>



                        
                    </a>
                </li>
            
                <li>
                    <a 
                        href='http://www.yprnet.com'
                        target="_blank"
                        title="天远网站"
                        rel="me"
                    >
                        
                        
                            <svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-home" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
  <path stroke="none" d="M0 0h24v24H0z"/>
  <polyline points="5 12 3 12 12 3 21 12 19 12" />
  <path d="M5 12v7a2 2 0 0 0 2 2h10a2 2 0 0 0 2 -2v-7" />
  <path d="M9 21v-6a2 2 0 0 1 2 -2h2a2 2 0 0 1 2 2v6" />
</svg>



                        
                    </a>
                </li>
            
        </ol><ol class="menu" id="main-menu">
        
        
        
        <li >
            <a href='/' >
                
                
                
                    <svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-home" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
  <path stroke="none" d="M0 0h24v24H0z"/>
  <polyline points="5 12 3 12 12 3 21 12 19 12" />
  <path d="M5 12v7a2 2 0 0 0 2 2h10a2 2 0 0 0 2 -2v-7" />
  <path d="M9 21v-6a2 2 0 0 1 2 -2h2a2 2 0 0 1 2 2v6" />
</svg>



                
                <span>主页</span>
            </a>
        </li>
        
        
        <li >
            <a href='/about/' >
                
                
                
                    <svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-user" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
  <path stroke="none" d="M0 0h24v24H0z"/>
  <circle cx="12" cy="7" r="4" />
  <path d="M6 21v-2a4 4 0 0 1 4 -4h4a4 4 0 0 1 4 4v2" />
</svg>



                
                <span>关于</span>
            </a>
        </li>
        
        
        <li >
            <a href='/archives/' >
                
                
                
                    <svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-archive" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
  <path stroke="none" d="M0 0h24v24H0z"/>
  <rect x="3" y="4" width="18" height="4" rx="2" />
  <path d="M5 8v10a2 2 0 0 0 2 2h10a2 2 0 0 0 2 -2v-10" />
  <line x1="10" y1="12" x2="14" y2="12" />
</svg>



                
                <span>归档</span>
            </a>
        </li>
        
        
        <li >
            <a href='/search/' >
                
                
                
                    <svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-search" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
  <path stroke="none" d="M0 0h24v24H0z"/>
  <circle cx="10" cy="10" r="7" />
  <line x1="21" y1="21" x2="15" y2="15" />
</svg>



                
                <span>搜索</span>
            </a>
        </li>
        
        
        <li >
            <a href='/links/' >
                
                
                
                    <svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-link" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
  <path stroke="none" d="M0 0h24v24H0z"/>
  <path d="M10 14a3.5 3.5 0 0 0 5 0l4 -4a3.5 3.5 0 0 0 -5 -5l-.5 .5" />
  <path d="M14 10a3.5 3.5 0 0 0 -5 0l-4 4a3.5 3.5 0 0 0 5 5l.5 -.5" />
</svg>



                
                <span>链接</span>
            </a>
        </li>
        

        <div class="menu-bottom-section">
            
            
                <li id="dark-mode-toggle">
                    <svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-toggle-left" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
  <path stroke="none" d="M0 0h24v24H0z"/>
  <circle cx="8" cy="12" r="2" />
  <rect x="2" y="6" width="20" height="12" rx="6" />
</svg>



                    <svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-toggle-right" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
  <path stroke="none" d="M0 0h24v24H0z"/>
  <circle cx="16" cy="12" r="2" />
  <rect x="2" y="6" width="20" height="12" rx="6" />
</svg>



                    <span>暗色模式</span>
                </li>
            
        </div>
    </ol>
</aside>

    <aside class="sidebar right-sidebar sticky">
        
            
                
    <section class="widget archives">
        <div class="widget-icon">
            <svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-hash" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
  <path stroke="none" d="M0 0h24v24H0z"/>
  <line x1="5" y1="9" x2="19" y2="9" />
  <line x1="5" y1="15" x2="19" y2="15" />
  <line x1="11" y1="4" x2="7" y2="20" />
  <line x1="17" y1="4" x2="13" y2="20" />
</svg>



        </div>
        <h2 class="widget-title section-title">目录</h2>
        
        <div class="widget--toc">
            <nav id="TableOfContents">
  <ol>
    <li><a href="#文件名后缀名">文件名、后缀名</a></li>
    <li><a href="#创建动态库">创建动态库</a>
      <ol>
        <li><a href="#格式">格式</a></li>
        <li><a href="#单个源文件目标直接生成动态库">单个源文件/目标直接生成动态库</a></li>
        <li><a href="#多个源文件目标生成动态库">多个源文件/目标生成动态库</a></li>
        <li><a href="#备注">备注</a></li>
        <li><a href="#windows上小熊猫c创建的c语言动态库testshared-c">Windows上小熊猫C++创建的C语言动态库<code>TestShared-C</code></a></li>
        <li><a href="#windows上小熊猫c创建的c语言动态库testshared-cpp">Windows上小熊猫C++创建的C++语言动态库<code>TestShared-CPP</code></a></li>
        <li><a href="#总结">总结</a></li>
        <li><a href="#gcc编译选项说明">gcc编译选项说明</a></li>
      </ol>
    </li>
    <li><a href="#创建静态库">创建静态库</a>
      <ol>
        <li><a href="#格式-1">格式</a></li>
        <li><a href="#单个源文件目标直接生成静态库">单个源文件/目标直接生成静态库</a></li>
        <li><a href="#多个源文件目标生成静态库">多个源文件/目标生成静态库</a></li>
        <li><a href="#windows上小熊猫c创建的c语言静态库teststatic-c">Windows上小熊猫C++创建的C语言静态库<code>TestStatic-C</code></a></li>
        <li><a href="#windows上小熊猫c创建的c语言静态库teststatic-cpp">Windows上小熊猫C++创建的C语言静态库<code>TestStatic-CPP</code></a></li>
        <li><a href="#总结-1">总结</a></li>
        <li><a href="#ar及其参数说明">ar及其参数说明</a></li>
      </ol>
    </li>
    <li><a href="#链接使用动态库和静态库">链接(使用)动态库和静态库</a>
      <ol>
        <li><a href="#方法1-i-头文件目录--l-库文件目录--l库名xxx无前缀lib和后缀名">方法1：<code>-I 头文件目录 -L 库文件目录 -l库名xxx(无前缀lib和后缀名)</code></a></li>
        <li><a href="#方法2-i-头文件目录--l-库文件目录--l完整文件名后缀">方法2：<code>-I 头文件目录 -L 库文件目录 -l:完整文件名+后缀</code></a></li>
        <li><a href="#方法3-i-头文件目录-文件路径完整文件名后缀">方法3：<code>-I 头文件目录 文件路径+完整文件名+后缀</code></a></li>
        <li><a href="#说明">说明：</a></li>
      </ol>
    </li>
    <li><a href="#其他">其他</a>
      <ol>
        <li><a href="#名称修饰">名称修饰</a></li>
        <li><a href="#函数导出">函数导出</a></li>
        <li><a href="#环境变量">环境变量</a></li>
        <li><a href="#查看用命令">查看用命令</a></li>
        <li><a href="#fpic和fpic比较">fpic和fPIC比较</a></li>
      </ol>
    </li>
  </ol>
</nav>
        </div>
    </section>

            
        
    </aside>


            <main class="main full-width">
    <article class="main-article">
    <header class="article-header">

    <div class="article-details">
    
    <header class="article-category">
        
            <a href="/categories/%E7%BC%96%E7%A8%8B/" >
                编程
            </a>
        
            <a href="/categories/c&#43;&#43;/" >
                C&#43;&#43;
            </a>
        
    </header>
    

    <div class="article-title-wrapper">
        <h2 class="article-title">
            <a href="/p/prog/cpp-gcc-sharedandstaticlib/">GCC上的动态库与静态库</a>
        </h2>
    
        
        <h3 class="article-subtitle">
            如何创建和链接使用
        </h3>
        
    </div>

    
        <footer class="article-time">
            
                <div>
                    <svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-calendar-time" width="56" height="56" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
  <path stroke="none" d="M0 0h24v24H0z"/>
  <path d="M11.795 21h-6.795a2 2 0 0 1 -2 -2v-12a2 2 0 0 1 2 -2h12a2 2 0 0 1 2 2v4" />
  <circle cx="18" cy="18" r="4" />
  <path d="M15 3v4" />
  <path d="M7 3v4" />
  <path d="M3 11h16" />
  <path d="M18 16.496v1.504l1 1" />
</svg>
                    <time class="article-time--published">2024-01-18</time>
                </div>
            

            
            
                        最后更新:
                        <time class="article-time--updated" datetime="2024-01-18 15:05:00 &#43;0800 CST" title="2024-01-18 15:05:00 &#43;0800 CST">
                            2024-01-18
                        </time>

            
                <div>
                    <svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-clock" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
  <path stroke="none" d="M0 0h24v24H0z"/>
  <circle cx="12" cy="12" r="9" />
  <polyline points="12 7 12 12 15 15" />
</svg>



                    <time class="article-time--reading">
                        阅读时长: 6 分钟
                    </time>
                </div>
            
        </footer>
    


    
</div>

</header>

    <section class="article-content">
    
    
    <h2 id="文件名后缀名">文件名、后缀名</h2>
<ul>
<li>静态链接库文件的后缀名：Linux通常用 <code>.a </code> ,Windows通常用 <code>.lib</code></li>
<li>动态链接库文件的后缀名：Linux通常用 <code>.so</code> ,Windows通常用 <code>.dll</code></li>
</ul>
<div class="table-wrapper"><table>
<thead>
<tr>
<th style="text-align:left">库类型</th>
<th style="text-align:left">Linux-GCC</th>
<th style="text-align:left">Windows-MinGW</th>
<th style="text-align:left">Windows-MSVC</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left">静态库</td>
<td style="text-align:left">libxxx.a</td>
<td style="text-align:left">libxxx.a</td>
<td style="text-align:left">xxx.lib</td>
</tr>
<tr>
<td style="text-align:left">动态库</td>
<td style="text-align:left">libxxx.so</td>
<td style="text-align:left">libxxx.dll</td>
<td style="text-align:left">xxx.dll</td>
</tr>
<tr>
<td style="text-align:left">动态库附加文件</td>
<td style="text-align:left"></td>
<td style="text-align:left">libxxx.dll.a</td>
<td style="text-align:left">xxx.lib</td>
</tr>
</tbody>
</table></div>
<ul>
<li>动态库附加文件<code>libxxx.dll.a</code>有时会有其他形式：<code>libxxx.a</code>、<code>libxxxdll.a</code>，后者改变了库名</li>
</ul>
<h2 id="创建动态库">创建动态库</h2>
<h3 id="格式">格式</h3>
<ul>
<li><code>gcc -fPIC -shared 源文件名(列表)... -o 动态链接库名</code></li>
<li><code>gcc -fPIC -shared 目标文件名(列表)... -o 动态链接库名</code></li>
</ul>
<h3 id="单个源文件目标直接生成动态库">单个源文件/目标直接生成动态库</h3>
<ul>
<li>方法1: <code>gcc -fPIC -shared xxx.c -o libxxx.so</code></li>
<li>方法2: <code>gcc -fPIC -shared xxx.o -o libxxx.so</code></li>
</ul>
<h3 id="多个源文件目标生成动态库">多个源文件/目标生成动态库</h3>
<ul>
<li>方法1: <code>gcc -fPIC -shared xxx1.c xxx2.c xxx3.c -o libxxx.so</code><br>
或:    <code>gcc -fPIC -shared *.c -o libxxx.so</code></li>
<li>方法2: <code>gcc -fPIC -shared xxx1.o xxx2.o xxx3.o -o libxxx.so</code></li>
</ul>
<h3 id="备注">备注</h3>
<ul>
<li><code>libxxx.so</code>可在Windows上改为<code>libxxx.dll</code></li>
</ul>
<h3 id="windows上小熊猫c创建的c语言动态库testshared-c">Windows上小熊猫C++创建的C语言动态库<code>TestShared-C</code></h3>
<ul>
<li>
<p><code>gcc.exe -c dllmain.c -o dllmain.o -O2 -pipe -DBUILDING_DLL=1</code></p>
</li>
<li>
<p><code>windres.exe -i TestShared-C_private.rc --input-format=rc -o Test-O coff</code></p>
</li>
<li>
<p><code>gcc.exe -mdll dllmain.o TestShared-C_private.res -o libTestShared-C.dll -s -static -Wl,--output-def,libTestShared-C.def,--out-implib,libTestShared-C.a</code></p>
</li>
<li>
<p>注：<code>-DBUILDING_DLL=1</code>是为了让<code>dll.h</code>中的宏<code>BUILDING_DLL</code>生效，下同</p>
</li>
</ul>
<h3 id="windows上小熊猫c创建的c语言动态库testshared-cpp">Windows上小熊猫C++创建的C++语言动态库<code>TestShared-CPP</code></h3>
<ul>
<li>
<p><code>g++.exe -c dllmain.cpp -o dllmain.o -O2 -std=c++2a -pipe -DBUILDING_DLL=1</code></p>
</li>
<li>
<p><code>windres.exe -i TestShared-CPP_private.rc --input-format=rc -o TestShared-CPP_private.res -O coff</code></p>
</li>
<li>
<p><code>g++.exe -mdll dllmain.o TestShared-CPP_private.res -o libTestShared-CPP.dll -s -static -Wl,--output-def,libTestShared-CPP.def,--out-implib,libTestShared-CPP.a</code></p>
</li>
</ul>
<h3 id="总结">总结</h3>
<ul>
<li>单步：<br>
<code>g++.exe -fPIC -mdll xxx1.c xxx2.c xxx3.c -o libxxx.dll -O2 -std=c++20 -pipe -s -static -Wl,--output-def,libxxx.def,--out-implib,libxxx.dll.a -DXXXXXX=1</code><br>
解析：
<ul>
<li><code>g++.exe -fPIC -mdll xxx1.c xxx2.c xxx3.c -o libxxx.dll</code></li>
<li><code>-O2 -std=c++20 -pipe -s -static</code></li>
<li><code>-Wl,--output-def,libxxx.def,--out-implib,libxxx.dll.a</code></li>
<li><code>-DXXXXXX=1</code></li>
</ul>
</li>
<li>分步：
<ul>
<li><code>g++.exe -c xxx1.c xxx2.c xxx3.c -O2 -std=c++20 -pipe -DXXXXXX=1</code><br>
或<code>g++.exe -c xxx1.c -O2 -o xxx1.o -std=c++20 -pipe -DXXXXXX=1</code></li>
<li><code>g++.exe -fPIC -mdll xxx1.o xxx2.o xxx3.o -o libxxx.dll -s -static -Wl,--output-def,libxxx.def,--out-implib,libxxx.dll.a</code></li>
</ul>
</li>
</ul>
<h3 id="gcc编译选项说明">gcc编译选项说明</h3>
<ul>
<li><code>-c</code>：只编译，不链接，生成目标文件<code>.o</code>。</li>
<li><code>-shared</code>：用于生成动态链接库（shared library）</li>
<li><code>-mdll</code>  ：为DLL生成代码(Generate code for a DLL)</li>
<li><code>-fPIC</code>：生成位置无关代码，方便动态链接，常用于编译动态链接库（shared library）</li>
<li><code>-Wl,&lt;选项&gt;</code>：将逗号分隔的 &lt;选项&gt; 传递给链接器。</li>
<li><code>--output-def &lt;file&gt;</code>：产生与导出符号相关的def文件(Generate a .DEF file for the built DLL)</li>
<li><code>--out-implib FILE</code>：产生用于提供__img_符号的导入库(Generate import library)</li>
<li><code>--kill-at</code>：从导出的符号中删除@nn(Remove @nn from exported symb)</li>
<li><code>-Wl,--output-def,libTestShared-CPP.def,--out-implib,libTestShared-CPP.a</code>中不要有空格</li>
</ul>
<h2 id="创建静态库">创建静态库</h2>
<h3 id="格式-1">格式</h3>
<p>简单地说，静态库是一个目标文件的简单集合。因此，首先有目标文件。再把生成的目标文件编译为静态库。</p>
<ul>
<li>第一步：先生成.o目标文件<br>
<code>gcc -c 源文件列表</code><br>
<code>gcc -c *.c</code><br>
如<code>gcc -c myfunc.c myproc.c</code>将得到<code>myfunc.o</code>和<code>myproc.o</code>。</li>
<li>第二步：由<code>ar</code>（archive，归档的意思）把多个目标文件集合起来编译为静态库。<br>
<code>ar rcs 静态链接库名称 目标文件1 目标文件2 ... </code><br>
<code>ar rcs libname.a *.o</code> 或 <code>gcc *.o -static -o libname.a</code><br>
如<code>ar rcs libmyjob.a myfunc.o myproc.o</code></li>
</ul>
<h3 id="单个源文件目标直接生成静态库">单个源文件/目标直接生成静态库</h3>
<ul>
<li>正确方法: <code>ar rcs libxxx.a xxx.o</code></li>
<li>错误方法: <code>ar rcs libxxx.a xxx.c</code>（静态库可以生成；当运行连接了该静态库的可执行程序会报错：could not read symbols:Archive has no index;run ranlib to add one）</li>
</ul>
<h3 id="多个源文件目标生成静态库">多个源文件/目标生成静态库</h3>
<ul>
<li>正确方法: <code>ar rcs libxxx.a xxx1.o xxx2.o xxx3.o</code></li>
<li>错误方法: <code>ar rcs libxxx.a xxx1.c xxx2.c xxx3.c</code>（静态库可以生成；当运行连接了该静态库的可执行程序会报错：could not read symbols:Archive has no index;run ranlib to add one）</li>
</ul>
<h3 id="windows上小熊猫c创建的c语言静态库teststatic-c">Windows上小熊猫C++创建的C语言静态库<code>TestStatic-C</code></h3>
<ul>
<li><code>gcc.exe -c hello.c -o hello.o -O2 -pipe</code></li>
<li><code>windres.exe -i TestStatic-C_private.rc --input-format=rc -o TestStatic-C_private.res -O coff</code></li>
<li><code>ar r libTestStatic-C.a hello.o TestStatic-C_private.res</code>
消息<code>ar: creating libTestStatic-C.a</code></li>
<li><code>ranlib libTestStatic-C.a</code></li>
</ul>
<h3 id="windows上小熊猫c创建的c语言静态库teststatic-cpp">Windows上小熊猫C++创建的C语言静态库<code>TestStatic-CPP</code></h3>
<ul>
<li><code>g++.exe -c hello.cpp -o hello.o -O2 -std=c++2a -pipe</code></li>
<li><code>windres.exe -i TestStatic-CPP_private.rc --input-format=rc -o TestStatic-CPP_private.res -O coff</code></li>
<li><code>ar r libTestStatic-CPP.a hello.o TestStatic-CPP_private.res</code>
消息<code>ar: creating libTestStatic-CPP.a</code></li>
<li><code>ranlib libTestStatic-CPP.a</code></li>
</ul>
<h3 id="总结-1">总结</h3>
<ul>
<li><code>g++.exe -c xxx1.c xxx2.c xxx3.c -O2 -std=c++20 -pipe</code><br>
或<code>g++.exe -c xxx1.c -O2 -o xxx1.o -std=c++20 -pipe</code></li>
<li><code>ar rcs libxxx.a xxx1.o xxx2.o xxx3.o</code></li>
</ul>
<h3 id="ar及其参数说明">ar及其参数说明</h3>
<ul>
<li>ar 是 Linux 的一个备份压缩命令，它可以将多个文件打包成一个备份文件（也叫归档文件），也可以从备份文件中提取成员文件。ar 命令最常见的用法是将目标文件打包为静态链接库。</li>
<li>参数r：在库中插入模块(替换)。当插入的模块名已经在库中存在，则替换同名的模块。如果若干模块中有一个模块在库中不存在，ar显示一个错误消息，并不替换其他同名模块。默认的情况下，新的成员增加在库的结尾处，可以使用其他任选项来改变增加的位置。</li>
<li>参数c：创建一个库。不管库是否存在，都将创建。</li>
<li>参数s：创建目标文件索引，这在创建较大的库时能加快时间。（补充：如果不需要创建索引，可改成大写S参数；如果.a文件缺少索引，可以使用ranlib命令添加）</li>
<li>有些场合<code>ar rcs</code>又用<code>ar -rc</code>、<code>ar -r</code>、<code>ar r</code>替代使用</li>
</ul>
<h2 id="链接使用动态库和静态库">链接(使用)动态库和静态库</h2>
<h3 id="方法1-i-头文件目录--l-库文件目录--l库名xxx无前缀lib和后缀名">方法1：<code>-I 头文件目录 -L 库文件目录 -l库名xxx(无前缀lib和后缀名)</code></h3>
<ul>
<li><code>g++ main.o -o main -I {INCLUDE_PATH} -L {LIB_PATH} -lname</code></li>
<li><code>g++ main.cpp -o main -I {INCLUDE_PATH} -L {LIB_PATH} -lname</code></li>
<li>举例链接动态库：<br>
<code>g++ main.cpp -o main.exe -O2 -std=c++20 -pipe -s -I  D:\C++Lib\XXX\include -L D:\C++Lib\XXX\lib -lxxx</code></li>
<li>举例链接静态库：<br>
<code>g++ main.cpp -o main.exe -O2 -std=c++20 -pipe -s -static -I  D:\C++Lib\XXX\include -L D:\C++Lib\XXX\lib -lxxx</code></li>
</ul>
<h3 id="方法2-i-头文件目录--l-库文件目录--l完整文件名后缀">方法2：<code>-I 头文件目录 -L 库文件目录 -l:完整文件名+后缀</code></h3>
<ul>
<li><code>g++ main.o -o main -I {INCLUDE_PATH} -L {LIB_PATH} -l:完整文件名+后缀</code></li>
<li><code>g++ main.cpp -o main -I {INCLUDE_PATH} -L {LIB_PATH} -l:完整文件名+后缀</code></li>
<li>举例链接动态库：<br>
<code>g++ main.cpp -o main.exe -O2 -std=c++20 -pipe -s -I D:\C++Lib\XXX\include -L D:\C++Lib\XXX\lib -l:libxxx.dll</code></li>
<li>举例链接静态库：<br>
<code>g++ main.cpp -o main.exe -O2 -std=c++20 -pipe -s -static -I D:\C++Lib\XXX\include -L D:\C++Lib\XXX\lib -l:libxxx.a</code></li>
</ul>
<h3 id="方法3-i-头文件目录-文件路径完整文件名后缀">方法3：<code>-I 头文件目录 文件路径+完整文件名+后缀</code></h3>
<ul>
<li><code>g++ main.o -o main -I {INCLUDE_PATH} {LIB_PATH_AND_LIBNAME}</code></li>
<li><code>g++ main.cpp -o main -I {INCLUDE_PATH} {LIB_PATH_AND_LIBNAME}</code></li>
<li>举例链接动态库：<br>
<code>g++ main.cpp -o main.exe -O2 -std=c++20 -pipe -s -I D:\C++Lib\XXX\include D:\C++Lib\XXX\lib\libxxx.dll</code></li>
<li>举例链接静态库：<br>
<code>g++ main.cpp -o main.exe -O2 -std=c++20 -pipe -s -static -I D:\C++Lib\XXX\include D:\C++Lib\XXX\lib\libxxx.a</code></li>
</ul>
<h3 id="说明">说明：</h3>
<ul>
<li><code>-I 头文件目录</code> 可用设置环境变量<code>set C_INCLUDE_PATH=头文件目录</code>替代</li>
<li><code>-L 库文件目录</code> 可用设置环境变量<code>set LIBRARY_PATH=库文件目录</code>替代</li>
<li><code>文件路径+完整文件名+后缀</code>不能省略路径，但可以用相对路径，<code>LIBRARY_PATH</code>对方法3无效</li>
</ul>
<h2 id="其他">其他</h2>
<h3 id="名称修饰">名称修饰</h3>
<ul>
<li>使用<code>extern &quot;C&quot;</code>来关闭名称修饰</li>
<li>使用编译器选项关闭名称修饰：一些编译器提供了选项来关闭名称修饰，例如在GCC编译器中，可以使用<code>-fno-rtti</code>选项关闭名称修饰。</li>
</ul>
<h3 id="函数导出">函数导出</h3>
<ul>
<li>MSVC <code>def文件</code>、<code>__declspec(dllexport)</code></li>
<li>MinGW64 <code>__declspec(dllexport)</code></li>
<li>cmake+MinGW64 默认会导出所有函数</li>
</ul>
<h3 id="环境变量">环境变量</h3>
<ul>
<li><code>C_INCLUDE_PATH</code>头文件路径的环境变量：</li>
<li><code>CPLUS_INCLUDE_PATH</code>头文件路径的环境变量：</li>
<li><code>LIBRARY_PATH</code>库文件路径的环境变量</li>
<li><code>LD_LIBRARY_PATH</code>是一个Linux环境变量，用于指定动态链接库的搜索路径。当一个程序运行时，如果需要使用动态链接库，系统会在<code>LD_LIBRARY_PATH</code>中指定的路径中搜索相应的库文件，以便程序能够正确运行。</li>
</ul>
<h3 id="查看用命令">查看用命令</h3>
<ul>
<li><code>nm libxxx.a</code> 查看库中包含的函数信息</li>
<li><code>ldd main</code>查看可执行程序依赖的动态库</li>
</ul>
<h3 id="fpic和fpic比较">fpic和fPIC比较</h3>
<ul>
<li>相同点：都是为了在动态库中生成位置无关的代码，通过全局偏移表（GOT）访问所有常量地址。程序启动时动态加载程序解析GOT条目。</li>
<li>不同点：如果链接的可执行文件的GOT大小超过计算机架构特定的最大值，则会在编译链接时报错误消息，提示 -fpic 不起作用；因此在这种情况下，需要使用 -fPIC 重新编译。GOT大小因芯片架构的不同而大小不一样，SPARC上为8k，在AArch64上为28k（笔者遇到的就是它，GOT超出了限制，所以报错），在m68k和RS / 6000上为32k。而x86上没有此限制。</li>
<li>温馨提示：为了保障程序在跨平台编译时整体可用，通常情况下建议都使用 fPIC</li>
</ul>

</section>


    <footer class="article-footer">
    
    <section class="article-tags">
        
            <a href="/tags/%E7%BC%96%E7%A8%8B/">编程</a>
        
            <a href="/tags/c&#43;&#43;/">C&#43;&#43;</a>
        
            <a href="/tags/gcc/">gcc</a>
        
            <a href="/tags/%E5%8A%A8%E6%80%81%E5%BA%93/">动态库</a>
        
            <a href="/tags/%E9%9D%99%E6%80%81%E5%BA%93/">静态库</a>
        
    </section>
<section class="article-lastmod">
        <svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-clock" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
  <path stroke="none" d="M0 0h24v24H0z"/>
  <circle cx="12" cy="12" r="9" />
  <polyline points="12 7 12 12 15 15" />
</svg>



        <span>
            最后更新于 2024-01-18 15:05 CST
        </span>
    </section></footer>
<footer class="article-footer">
    
    <section class="article-copyright">
        <svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-copyright" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
  <path stroke="none" d="M0 0h24v24H0z"/>
  <circle cx="12" cy="12" r="9" />
  <path d="M14.5 9a3.5 4 0 1 0 0 6" />
</svg>



        
		<span>版权声明：本文遵循&ensp;&ensp;<a href="https://creativecommons.org/licenses/by-nc-nd/4.0/deed.zh-hans" target="_blank" rel="noopener">CC BY-NC-ND 4.0 DEED (署名-非商业性使用-禁止演绎4.0国际)</a>&ensp;&ensp;版权协议。</span>
	</section>	
    
</footer>
<footer class="article-footer">
    
    <section class="article-copyright">
        <span>&ensp;&ensp;&ensp;&ensp;&ensp;转载说明：请附上本文链接及上述版权声明。</span>
	</section>	
    
</footer>


    
</article>

    

    

<aside class="related-content--wrapper">
    <h2 class="section-title">相关文章</h2>
    <div class="related-content">
        <div class="flex article-list--tile">
            
                
<article class="">
    <a href="/p/prog/cpp-gcc-locale-windows-mingw64/">
        
        

        <div class="article-details">
            <h2 class="article-title">MinGW-w64 GCC本地化-Windows</h2>
        </div>
    </a>
</article>

            
                
<article class="">
    <a href="/p/prog/cpp-gcc-locale-linux/">
        
        

        <div class="article-details">
            <h2 class="article-title">GCC本地化-Linux</h2>
        </div>
    </a>
</article>

            
                
<article class="">
    <a href="/p/prog/cpp-gcc-env-var/">
        
        

        <div class="article-details">
            <h2 class="article-title">GCC环境变量</h2>
        </div>
    </a>
</article>

            
                
<article class="">
    <a href="/p/prog/cpp-qt5compile-msvc/">
        
        

        <div class="article-details">
            <h2 class="article-title">Qt5编译(MSVC)</h2>
        </div>
    </a>
</article>

            
                
<article class="">
    <a href="/p/prog/cpp-qt5compile-mingw-w64/">
        
        

        <div class="article-details">
            <h2 class="article-title">Qt5编译(MinGW-w64)</h2>
        </div>
    </a>
</article>

            
        </div>
    </div>
</aside>

     
    
        
    

    <footer class="site-footer">
    
	<section class="copyright">
	    技术交流： <a href="mailto:ypr@yprnet.com" target="_blank" rel="noopener">ypr@yprnet.com</a>、
		<a href="mailto:ypr@yuanpeirong.com" target="_blank" rel="noopener">ypr@yuanpeirong.com</a>
		<br />版权所有 © 2010-2025 <a title="访问天远网站" href="http://www.yprnet.com/" target="_blank" rel="noopener">YuanPeirong TianYuan</a> All Rights Reserved. Powered By <a title="访问天远网站" href="http://www.yprnet.com/" target="_blank" rel="noopener">天远</a>
    </section>
    <section class="powerby">
        Built with <a href="https://gohugo.io/" target="_blank" rel="noopener">Hugo</a> <br />
        主题 <b><a href="https://github.com/CaiJimmy/hugo-theme-stack" target="_blank" rel="noopener" data-version="3.21.0">Stack</a></b> 由 <a href="https://jimmycai.com" target="_blank" rel="noopener">Jimmy</a> 设计 | <a href="http://www.yprnet.com/" target="_blank" rel="noopener">天远</a> 优化修改
    </section>
    <section class="powerby">
        <a target="_blank" href="https://beian.miit.gov.cn">浙ICP备15010776号-3</a>
    </section>
</footer>


    
<div class="pswp" tabindex="-1" role="dialog" aria-hidden="true">

    
    <div class="pswp__bg"></div>

    
    <div class="pswp__scroll-wrap">

        
        <div class="pswp__container">
            <div class="pswp__item"></div>
            <div class="pswp__item"></div>
            <div class="pswp__item"></div>
        </div>

        
        <div class="pswp__ui pswp__ui--hidden">

            <div class="pswp__top-bar">

                

                <div class="pswp__counter"></div>

                <button class="pswp__button pswp__button--close" title="Close (Esc)"></button>

                <button class="pswp__button pswp__button--share" title="Share"></button>

                <button class="pswp__button pswp__button--fs" title="Toggle fullscreen"></button>

                <button class="pswp__button pswp__button--zoom" title="Zoom in/out"></button>

                
                
                <div class="pswp__preloader">
                    <div class="pswp__preloader__icn">
                        <div class="pswp__preloader__cut">
                            <div class="pswp__preloader__donut"></div>
                        </div>
                    </div>
                </div>
            </div>

            <div class="pswp__share-modal pswp__share-modal--hidden pswp__single-tap">
                <div class="pswp__share-tooltip"></div>
            </div>

            <button class="pswp__button pswp__button--arrow--left" title="Previous (arrow left)">
            </button>

            <button class="pswp__button pswp__button--arrow--right" title="Next (arrow right)">
            </button>

            <div class="pswp__caption">
                <div class="pswp__caption__center"></div>
            </div>

        </div>

    </div>

</div><script 
                src="https://cdn.jsdelivr.net/npm/photoswipe@4.1.3/dist/photoswipe.min.js"integrity="sha256-ePwmChbbvXbsO02lbM3HoHbSHTHFAeChekF1xKJdleo="crossorigin="anonymous"
                defer
                >
            </script><script 
                src="https://cdn.jsdelivr.net/npm/photoswipe@4.1.3/dist/photoswipe-ui-default.min.js"integrity="sha256-UKkzOn/w1mBxRmLLGrSeyB4e1xbrp4xylgAWb3M42pU="crossorigin="anonymous"
                defer
                >
            </script><link 
                rel="stylesheet" 
                href="https://cdn.jsdelivr.net/npm/photoswipe@4.1.3/dist/default-skin/default-skin.min.css"crossorigin="anonymous"
            ><link 
                rel="stylesheet" 
                href="https://cdn.jsdelivr.net/npm/photoswipe@4.1.3/dist/photoswipe.min.css"crossorigin="anonymous"
            >

            </main>
        </div>
        <script 
                src="https://cdn.jsdelivr.net/npm/node-vibrant@3.1.6/dist/vibrant.min.js"integrity="sha256-awcR2jno4kI5X0zL8ex0vi2z&#43;KMkF24hUW8WePSA9HM="crossorigin="anonymous"
                
                >
            </script><script type="text/javascript" src="/ts/main.js" defer></script>
<script>
    (function () {
        const customFont = document.createElement('link');
        customFont.href = "https://fonts.googleapis.com/css2?family=Lato:wght@300;400;700&display=swap";

        customFont.type = "text/css";
        customFont.rel = "stylesheet";

        document.head.appendChild(customFont);
    }());
</script>

    </body>
</html>
